package service

import (
	"batbat-backend/app/dao"
	"batbat-backend/app/model"
	"context"
	"github.com/gogf/gf/errors/gerror"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gconv"
	"golang.org/x/crypto/bcrypt"
)

// Session 会话服务, 掌管用户登录登出
var Session = sessionService{}

type sessionService struct{}

// Login 用户登录
func (s *sessionService) Login(ctx context.Context, phoneNumber string, password string) (*model.UserContext, error) {
	var (
		user        *model.User
		userContext *model.UserContext
	)
	// 通过手机号码获取用户信息
	err := dao.User.Ctx(ctx).
		Fields(dao.User.Columns).
		Where(dao.User.Columns.PhoneNumber, phoneNumber).
		Scan(&user)
	if err != nil {
		g.Log().Ctx(ctx).Errorf("查询用户信息失败: %v", err)
		return nil, gerror.New("登陆失败")
	}
	if user == nil {
		return nil, gerror.New("用户名或密码错误")
	}
	// 校验用户的密码是否正确
	err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
	if err != nil {
		return nil, gerror.New("用户名或密码错误")
	}
	err = gconv.Scan(user, &userContext)
	if err != nil {
		g.Log().Ctx(ctx).Errorf("转换用户对象到用户上下文对象失败: %v", err)
		return nil, gerror.New("登陆失败")
	}
	return userContext, nil
}
